package linguaggio;

import java.io.Serializable;
import java.util.LinkedList;

/**
 *
 * @author valerio
 */
public class Grammatica implements Serializable{
    public enum ErrorType{
        nothing, produzioniErrori, panicMode
    }
    private LinkedList<Token> terminali;
    private LinkedList<NonTerminale> nonTerminali;
    private LinkedList<Token> left;
    private LinkedList<Token> right;
    private LinkedList<Token> nonassoc;
    private LinkedList<NonTerminale> produzioniErrore;
    private ErrorType errorType;
    
    public Grammatica(){
        
    }
    public Grammatica(LinkedList<Token> terminali, LinkedList<NonTerminale> nonTerminali) {
        this.terminali = terminali;
        this.nonTerminali = nonTerminali;
        this.errorType = ErrorType.nothing;
    }
    
    
    public Grammatica(LinkedList<Token> terminali, LinkedList<NonTerminale> nonTerminali, LinkedList<Token> left, LinkedList<Token> right, LinkedList<Token> nonassoc){
        this.terminali = terminali;
        this.nonTerminali = nonTerminali;
        this.left = left;
        this.right = right;
        this.nonassoc = nonassoc;
        this.errorType = ErrorType.nothing;
    }
    public Grammatica(LinkedList<Token> terminali, LinkedList<NonTerminale> nonTerminali, ErrorType typeError, LinkedList<NonTerminale> produzioniErrore){
        this.terminali = terminali;
        this.nonTerminali = nonTerminali;
        this.errorType = typeError;
        this.produzioniErrore = produzioniErrore;
    }

    public Grammatica(LinkedList<Token> terminali, LinkedList<NonTerminale> nonTerminali, LinkedList<Token> left, LinkedList<Token> right, LinkedList<Token> nonassoc, ErrorType errorType, LinkedList<NonTerminale> produzioniErrore) {
        this.terminali = terminali;
        this.nonTerminali = nonTerminali;
        this.left = left;
        this.right = right;
        this.nonassoc = nonassoc;
        this.errorType = errorType;
        this.produzioniErrore = produzioniErrore;
    }

    
    public LinkedList<Token> getLeft() {
        return left;
    }

    public void setLeft(LinkedList<Token> left) {
        this.left = left;
    }

    public LinkedList<NonTerminale> getNonTerminali() {
        return nonTerminali;
    }

    public void setNonTerminali(LinkedList<NonTerminale> nonTerminali) {
        this.nonTerminali = nonTerminali;
    }

    public LinkedList<Token> getRight() {
        return right;
    }

    public void setRight(LinkedList<Token> right) {
        this.right = right;
    }

    public LinkedList<Token> getTerminali() {
        return terminali;
    }

    public void setTerminali(LinkedList<Token> terminali) {
        this.terminali = terminali;
    }

    public LinkedList<Token> getNonassoc() {
        return nonassoc;
    }

    public void setNonassoc(LinkedList<Token> nonassoc) {
        this.nonassoc = nonassoc;
    }

    @Override
    public String toString() {
        return "Grammatica{" + "terminali=" + terminali.size() + ", nonTerminali=" + nonTerminali.size() + ", left=" + left.size() + ", right=" + right.size() + ", nonassoc=" + nonassoc.size() + '}';
    }

    public ErrorType getErrorType() {
        return errorType;
    }

    public void setErrorType(ErrorType errorType) {
        this.errorType = errorType;
    }

    public LinkedList<NonTerminale> getProduzioniErrore() {
        return produzioniErrore;
    }

    public void setProduzioniErrore(LinkedList<NonTerminale> produzioniErrore) {
        this.produzioniErrore = produzioniErrore;
    }
    
    
}
